//全部路由组件：登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由)
//用户未登录：可以访问login,其余6个路由不能访问(指向login)
//用户登录：不可以访问login(指向首页),其余的路由可以访问
//引入路由器
import router from './router'
//引入进度条及其样式
//@ts-ignore
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
nprogress.configure({ showSpinner: false })
//引入用户仓库
import pinia from './store'
import useUserStore from './store/modules/user'
//引入用户标题和logo的配置文件
import setting from './setting'

//用户仓库
let userStore = useUserStore(pinia)

//全局前置路由守卫
/* to：将要访问哪个路由 
   from：从哪个路由而来 
   next：路由放行函数 */
router.beforeEach(async (to: any, from: any, next: any) => {
  //修改标题
  document.title = `${setting.title}-${to.meta.title}`
  //进度条开始
  nprogress.start()
  //token：判断用户登录还是未登录
  let token = userStore.token
  //用户名字：判断是否需要发送请求获取数据
  let username = userStore.username
  //用户已登录
  if (token) {
    //用户已登录登陆访问登录页
    if (to.path == '/login') {
      next({ path: '/' }) //重定向到首页
    } else {
      //用户已登录登陆访问其他6个路由
      //有用户信息
      if (username) {
        next()
      } else {
        //没有用户信息
        //发送请求获取到了用户信息：1.本地存储中有token
        try {
          await userStore.userInfo()
          //特殊情况处理：获取到用户信息的时候，但是此时异步路由还没有加载完毕，页面出现空白
          next({ ...to })
        } catch (error) {
          //发送请求没有获取到用户信息：1.token过期 2.用户手动修改了token
          //退出登录: 1.清空用户仓库中的用户名、头像 、token和本地储存的token 2.通知服务器本地用户唯一标识失效
          await userStore.userLogout()
          //重定向到登录页
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    //用户未登录
    //访问登录页
    if (to.path == '/login') {
      next()
    } else {
      //访问其他6个路由
      next({ path: '/login', query: { redirect: to.path } }) //重定向到登录页
    }
  }
})

//全局后置路由守卫
router.afterEach((to: any, from: any) => {
  // 进度条结束
  nprogress.done()
})
